﻿/*
 * MStorageType.h
 *
 *  Created on: 2017年3月1日
 *      Author: chuanjiang.zh
 */

#ifndef MSTORAGETYPE_H_
#define MSTORAGETYPE_H_

#include <time.h>

#ifndef MAX_PATH
#define	MAX_PATH	256
#endif //


namespace av
{

/// 录像文件格式
enum RecordFileFormat
{
	kRawFile = 0,
	kTsFile,
	kMp4File,
	kPsFile
};

enum StorageConst
{
	DEFAULT_FILE_DURATION = 60 * 10, /// 默认录像文件时长, 单位为秒
	DEFAULT_MAX_DISK_USAGE = 98,	 /// 默认的磁盘使用比例
	MAX_RECORD = 256,
	MAX_ID = 45
};

/// 事件类型
enum StorageEventType
{
	EVENT_RECORD_START  	= 0x0001,	/// 开始录像
	EVENT_RECORD_STOP   	= 0x0002,	/// 停止录像, 录像完成
	EVENT_RECORD_SWITCH 	= 0x0004,	/// 切换录像
	EVENT_RECORD_DELETE		= 0x0008,	/// 删除录像, 覆盖录像
	EVENT_RECORD_IO_FAULT	= 0x0010,	/// IO 故障
	EVENT_RECORD_CORRUPT    = 0x0020,	/// 损坏的录像

	EVENT_STORAGE_NOSPACE 	= 0x0100,	/// 空间不足
	EVENT_RECORD_FILE_OPENED= 0x1000,
	EVENT_RECORD_FILE_CLOSED= 0x1001,

	EVENT_RECORD_CLEARD		= 0x2000	/// 清理录像完成

};

enum MRecordType
{
	kRecordTime   = 0x01,
	kRecordAlarm  = 0x02,
	kRecordManual = 0x04

};

/**
 * 录像查找条件
 * @param device  设备标识, 为空 表示忽略
 * @param fromTime  起始时间, <= 0 表示忽略
 * @param toTime    结束时间, <= 0 表示忽略
 * @param recordType    录像类型, <=0 表示忽略
 * @param recorder  录像者, 为空表示忽略
 */
struct MRecordQuery
{
    int recordType;
    time_t fromTime;
    time_t toTime;
    const char* device;
    const char* recorder;
};

/// 录像
struct MRecord
{
	int id;
	char	device[MAX_ID];		/// 设备ID
	time_t startTime;		/// 开始时间
	time_t stopTime;		/// 结束时间
	char	filename[MAX_PATH];	/// 文件名
	char 	filepath[MAX_PATH];	/// 文件路径
	int64_t	filesize;	/// 文件大小
	int		duration;	/// 时长, 单位为秒
	char 	url[MAX_PATH];
	int 	events;		/// 关联报警事件
	int		type;		/// 录像类型
	char	recorder[MAX_ID];	/// 录像者
	char	memo[MAX_PATH];	/// 备注

};


/// 报警类型
enum AlarmEventType
{
	ALARM_STORAGE_FAULT = 0x2000,	/// 存储器故障
	ALARM_STORAGE_BACKUP_FAULT = 0x4000, 	/// 灾备存储器故障
	ALARM_STORAGE_OVERRUN = 0x8000,	/// 存储器容量超限

};

/// 报警事件
struct AlarmEvent
{
	int     id;
	int     type;		/// 事件类型
	char    device[MAX_ID];     /// 设备ID
	char    name[MAX_PATH];	/// 名称
	time_t	startTime;		/// 触发时间
	char    memo[MAX_PATH];	/// 备注
};


/// 媒体存储事件. 用于表示回调相关数据
struct StorageEvent
{
	int 	type;
	time_t	time;
	char    device[MAX_ID];     /// 设备ID

	union Data
	{
		MRecord record;

		struct Storage
		{
			char path[MAX_PATH];
			int64_t total;
			int64_t free;
			float   percent;

		} storage;

		int	cleared;

	} data;

};





}


#endif /* MSTORAGETYPE_H_ */
